במחלקה של המשתמשים הרשומים הקונסטרוקטור יקבל Token של המשתמש הרשום וכל שאר הפונקציות בו יעבדו וישלפו מהמסד לפי הToken.
ובמחלקה של המשתמשים הלא רשומים הקונסטרוקטור לא יקבל דבר והפונקציות שם ישלפו מידע מהמסד לכל המשתמשים האורחים.
לדוגמא אם משתמש רשום גולש בפרופיל שלו, המחלקה User תעבוד ( תשלוף לו מידע על המשתמש שלו לפי ה Token שלו) , ואם איזה אורח מסויים נכנס לפרופיל של משתמש כלשהו המחלקה Guest תעבוד (תשלוף לאורח מידע על המשתמש האמצעות ה Id).
** קראתי בכמה מקומות שזיהוי משתמש באמצעות ה Token הוא יותר טוב מאשר זיהוי משתמש באמצעות ה Id, משהו שקשור לסשנים, כי בכל פעם שהמשתמש מתחבר לאתר אני יוצר מחרוזת רנדומלית שמעדכנת את השדה Token. לכן כל הפרוצדורה הזו.
אשמח אם תציעו דרכים נוספות לפתרון דבר כזה או תכנון אחר של המחלקה, אני מאמין שזה לא יעזור רק לי.
13 תשובות
קודם כל - Guest ולא Ghost.
ואני ממליץ על 3 מחלקות:
Member שיורשת מ-User - מייצגת משתמש מחובר.
Guest שיורשת מ-User - מייצגת משתמש אורח.
User - מייצגת משתמש כללי. המאפיינים שלו יהיו מאפיינים שיש לכ משתמש שנכנס לאתר, כמו ip.
לדעתי אתה קצת מבלבל דברים.
תסתכל על מחלקה יוזר בתור עצם שמייצג משתמש.
ובמערכת שלך תעשה איזשהו משתנה שהוא מייצג את המשתמש הנוכחי ויכול להיות או מופע של המחלקה יוזר
או null.
סתם עצם שמייצג מכונית לא יכול להיות מכונית חונה או מכונית נוסעת, היא יכולה להיות רק מכונית.
מה שעושה אותו חונה או נוסע זה העובדה האם אתה נמצא בתוכה או לא.
דוגמא בקוד היית נראה בערך ככה:
$user = new UsersRepository()->findById($userId);
if(null === $user)
{
echo '404';
}
elseif (null !== $mySite->currentUser && $mySite->currentUser->id === $user->id)
{
echo 'hi Mr ', $mySite->currentUser->name,
' Feel free to edit your profile: ',
'<form></form>';
}
else
{
echo 'Profile of ', $mySite->currentUser->name;
}
עכשיו שים לב שפה בקוד הופיעו שני מחלקות חדשות.
הראשונה זה UsersRepository
שאתה יכול כרגע להתעלם ממנה ולהחליף אותה במטודה סטטית של המחלקה יוזר
לדגומה User::getById
למרות שאני לא ממליץ לעשות את זה וכן ליצור קלאס שהמטרה שלו תהיה לשלוף יוזרים מהמסד ולהחזיר לך מופעים של יוזר.
המחלקה השניה שנוספה היא המחלקה של $mySite
שהיא כנראה תהיה איזשהו אובייקט גלובאלי שתאתכל בקובץ index.php שלך ותעביר לכל מקום
בצורת singleton לדוגמה. (חפש את המדריך על סינגלטון באתר)
ואז ייצא לך משהו כזה:
$mySite = MySite::getInstance()
היי קודם תודה על התשובות.
@iiddaannyy, תודה רבה הבנתי.
@intval, את שלך קצת פחות הבנתי, אשמח אם תרחיב קצת יותר:
את השורות שיש בהן 2 הפניות, כלומר 2 חיצים ( <- ) לא הבנתי איך הקוד אמור להראות - איך המחלקה אמורה להיות כדי לאפשר הפניה כזו:
$mySite->currentUser->id
ומה לגבי ה TOKEN ? זה יותר שימושי ? יותר נוח ? יותר מאובטח במידה מסויימת ? או שפשוט עדיף להציג את הפרטים למשתמש הרשום ולמשתמש הלא רשום על ידי ה ID של המשתמש ולמחוק את העמודה TOKEN מהמסד?
כי כמו שהסברתי:
- בפרופיל של משתמש אחר מסויים (שאורח או משתמש מחובר כלשהו צופה בו) אציג את הפרטים על ידי ה ID של המשתמש.
- למשתמש מחובר אציג לו את הפרטים והסטטיסטיקות בפרופיל שלו באמצעות ה TOKEN שלו ( הטוקן מתעדכן ומשתנה בכל פעם שהמשתמש מתחבר לאתר, זה לא משהו שנשאר קבוע כמו הID ).
מה יותר בטוח, יעיל, עדיף ובכללי הכי טוב ?
סליחה שאני כזה חופר, אני פשוט מנסה להבין את העיניין הזה כבר הרבה זמן וכמה שאני קורא אני לא מבין, זה מתסכל באיזהשהו שלב :S.
אני לא יודע מה זה token ואני אישית לא רואה משהו יותר שימושי מ id.
לגבי שני חצים
{
public $subClass;
public $number;
public function __construct($n)
{
$this->number = $n;
}
}
$class1 = new AnyClass(1);
$class2 = new AnyClass(2);
$class3 = new AnyClass(3);
$class1->subClass = $class2;
$class2->subClass = $class3;
echo $class1->subClass->subClass->number;
// same as
// ( ($class1->subClass)->subClass)->number;
// ( $class2 ->subClass)->number;
// $class3->number;
Token זה מחרוזת של מספרים ואותיות רנדומליות. בכל פעם שמשתמש מתחבר לאתר, אני יוצר מחרוזת רנדומלית ומכניס אותה למסד ובנוסף משווה אותה לסשן של היוזר. כך שבעצם הסשן שווה לטוקן שבמסד שמשתנה בכל פעם שהמשתמש מתחבר מחדש למערכת. כל השליפות שמציגות למשתמש המחובר את פרטיו, נשלפות ע׳י הטוקן שזה בעצם הסשן. אם הסשן לא שווה לטוקן שבמסד אז המשתמש לא מחובר.
לגבי הפעולה של שני החיצים, תודה רבה הבנתי.
עכשיו מה דעתך על הפעולה עם הטוקן ?
מיותר לחלוטין.
אתה עצמך רואה כל סיבה לגיטימית שהיא לסבך את זה מעבר לשליפה לפי ID (חוץ מ "קראתי איפשהו שזה טוב" ?)
האמת שאתה צודק, הדבר היחידי שקראתי עליו זה ׳שזה טוב׳. תודה רבה:).
בדוגמא שנתת בקוד הראשון כתבת:
כתבת UsersRepository() זו מחלקה אחת שמפנה (->) למחלקה findById ששולפת נתונים על ידי שליפה באמצעות האיידי ?
או שזה פונקציה רגילה וההפניה אליה מתבצעת באותה הדרך ? אני פשוט רוצה לעבוד ע׳פ מה שאתה כתבת כיאילו ללמוד את זה בגלל זה השאלות .... סליחה אם זה חופר:)
findById זה מטודה (פעולה של המחלקה UsersRepository).
אם אתה לא מצליח לקרוא את זה בשורה אחת, תפריד אותם לשני שורות.
$user = $repository->findById($userId);
ולמען האמת, צריך לשים שם סוגריים, אחרת המפענח של PHP לא יוכל את זה.
אוקי תודה הבנתי.
עכשיו שאלה אחרונה לגבי השורה:
currentUser זו שיטה והחץ (->) מפנה למשתנה name שנמצא בתוך השיטה currentUser ?
לא הצלחתי לכתוב את הקוד שיתאים לצורה הזו, זה לא אמור להיות ככה וזהו:
המשתנה $name יהיה public והמטודה currentUser תעדכן אותה לפי השליפה ?
בעצם המחלקה UsersRepository היא רק מחפשת את שם המשתמש במסד לפי האיידי.
והמחלקה של mySite היא בעצם אחראית על כל השליפות והמתודות של המשתמש כאשר הוא מחובר, והיא בודקת שהוא מחובר אם קיים איידי מהמחלקה UsersRepository ( שגם ב UsersRepository מתרחשת ההרשמה? )?
ואי זה קצת מסובך אבל אני בסוף יבין את זה אני מקווה.
שיטה זה מהמילה שיט ?
יש מילה כזאת מטודה שזה פעולה פונקציה שהיא בתוך מחלקה.
פונקציות בשפת PHP תמיד באות עם סוגריים
בשביל מה המחלקה usersrepository כתבתי למעלה
וגם כתבתי שאתה יכול להתעלם ממנה.
אם החץ מוביל למשהו שהוא בלי סוגריים, אז זה לא מטודה אלה מאפיין של המחלקה.
ואם יש שני חצים, זה אומר שהחץ הראשון גם החזיר מחלקה.
// MEANS THAT
$mySite->currentUser is also a class
// and that class has a property called NAME
אני רואה שפספסת את הדוגמה הזאת. תסתכל עליה עוד פעם.
"סתם עצם שמייצג מכונית לא יכול להיות מכונית חונה או מכונית נוסעת, היא יכולה להיות רק מכונית"
נכון. כי "חונה" או "לא חונה" זו פשוט תכונה אחת של המכונית.
לעומת זאת, User אתה יכול לפרק ל-Member ול-Guest. זה כי קיימים המון דברים ב-Member שאין לך ב-Guest ולכן הפירוק הוא נכון.
זה כמו ש-Worker אתה יכול לפרק לעובד רגיל או למנהל כי במנהל יהיו לך הרבה תכונות ודברים שלעובד רגיל אין.
השאלה האם לפרק תלויה במה ייצא לך מהפירוק הזה. אם הרווחת משהו וחסכת - אני הייתי מפרק. אם לא אז לא.
גם את Member אפשר לפרק ל-Admin ול-Standard, אבל לא יוצא לי מזה כלום. Standard תהיה מחלקה ריקה וגם ב-Admin לא יהיה לי יותר מידי מה להוסיף. ככה שעדיף לא לפרק.
ככה שכל מקרה לגופו.
הפירוק שלו היה האם המשתמש הזה שלי או לא שלי.
זה כמו המגפיים של דינה או של שרה.
זה מגפיים.
אבל שייכות הם למי שנועל אותם.
ולא משנה עם זה מגפיים גבוהות או נמוכות.
(מדובר במקרה שלו ספציפית)
פירוק של מחלקת User לשתי תתי מחלקות: MyUser, SomeoneElsesUser בכלל לא הגיוני. מה ההבדלים בין המחלקות? משתמש הוא משתמש וזה לא משנה האם הוא שלי או לא.
לעומת זאת, יש הבדל גדול בין רשום לבין אורח.